#include "mc31xx_hal.h"

//HAL库版本
#define __MC31xx_HAL_VERSION_MAIN   (0x01U) /*!< [31:24] main version */
#define __MC31xx_HAL_VERSION_SUB1   (0x02U) /*!< [23:16] sub1 version */
#define __MC31xx_HAL_VERSION_SUB2   (0x02U) /*!< [15:8]  sub2 version */
#define __MC31xx_HAL_VERSION_RC     (0x00U) /*!< [7:0]  release candidate */
#define __MC31xx_HAL_VERSION         ((__MC31xx_HAL_VERSION_MAIN << 24)\
                                        |(__MC31xx_HAL_VERSION_SUB1 << 16)\
                                        |(__MC31xx_HAL_VERSION_SUB2 << 8 )\
                                        |(__MC31xx_HAL_VERSION_RC))

//全局变量
static volatile u8 g_ucInitFlag = 0;
u32 g_uwPrintfMuxHandle;            //printf锁句柄

//hal库初始化第1步
void HAL_SYS_Init(void)
{
    HAL_Thread_Init();
    HAL_MUX_Init();
    
    g_ucInitFlag |= 1;
}
//用户实现，在此初始化动作执行在其他线程运行之前
__weak void HAL_Main_init(void){}   
//hal库初始化第2步，此两步之后所有使用了HAL_Thread_Start();的线程开始运行
void HAL_USR_Init(void)
{
    while(g_ucInitFlag!=1){}
    HAL_MUX_Create(&g_uwPrintfMuxHandle);
    HAL_Main_init();
    g_ucInitFlag |= 2;
}
//等待初始化完成，其他线程同步启动
void HAL_Thread_Start(void)
{
    while(g_ucInitFlag!=3){}
}

void HAL_Thread_End(void)
{
    while (1);
}

void HAL_DeInit(void)
{
    g_ucInitFlag = 0;
}

//通用延时，会多大概27个线程时钟的误差
//最大延时0xFFFFFFFF/(SYS_CORE_CLK_MHZ/4)
void delay_us(u32 nus)
{
    u32 start,stop,ticks;
    start=CORE_CNT;
    ticks = nus * SYS_CORE_CLK_MHZ/4; 
    if(0xFFFFFFFF-start>=ticks){
        stop=start+ticks;
        while(CORE_CNT<stop && CORE_CNT>start){}
    }
    else{
        stop=ticks-(0xFFFFFFFF-start);
        while(CORE_CNT>start){}
        while(CORE_CNT<stop){}
    }
}
// void delay_us(u32 nus)
// {
//     u32 start,stop,ticks;
//     start=CORE_CNT;
//     ticks = nus * SYS_CORE_CLK_MHZ/4; 
//     while(CORE_CNT-start<ticks){}
// }

//ms延时，允许超大的延时
void HAL_Delay(u32 Delay)
{
    while(Delay>80000){
		delay_us(80000*1000);
		Delay-=80000;
	}
	delay_us(Delay*1000);
}

//获取hal库版本
uint32_t HAL_GetHalVersion(void)
{
  return __MC31xx_HAL_VERSION;
}

//获取设备号唯一编号等，预留
uint32_t HAL_GetREVID(void)
{

}

uint32_t HAL_GetDEVID(void)
{

}

uint32_t HAL_GetUIDw0(void)
{

}

uint32_t HAL_GetUIDw1(void)
{

}

uint32_t HAL_GetUIDw2(void)
{

}
